package edu.mis.core;


import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.ext.interceptor.SessionInViewInterceptor;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin;

import edu.mis.core.cron4j.Cron4jPlugin;
import edu.mis.core.handler.ContextPathHandler;
import edu.mis.model._MappingKit;
import edu.mis.modules.accountCaption.AccountCaptionController;
import edu.mis.modules.accountingReports.LrbController;
import edu.mis.modules.accountingReports.ZcfzbController;
import edu.mis.modules.blog.BlogController;
import edu.mis.modules.index.IndexController;
import edu.mis.modules.kmye.KmyeController;
import edu.mis.modules.ledger.FseSsphController;
import edu.mis.modules.ledger.GeneralLedgerController;
import edu.mis.modules.ledger.SubsidiaryLedgerController;
import edu.mis.modules.log.LogController;
import edu.mis.modules.log.LogInterceptor;
import edu.mis.modules.partner.PartnerController;
import edu.mis.modules.product.ProductController;
import edu.mis.modules.resource.ResourceController;
import edu.mis.modules.role.RoleController;
import edu.mis.modules.sale.SaleController;
import edu.mis.modules.user.LoginInterceptor;
import edu.mis.modules.user.UserController;
import edu.mis.modules.voucher.AuditController;
import edu.mis.modules.voucher.VoucherController;
import edu.mis.weixin.WeixinApiController;
import edu.mis.weixin.WeixinMsgController;
import edu.mis.viewtest.TestController;
/**
 * API引导式配置
 */
public class MisConfig extends JFinalConfig {
	
	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		// 加载少量必要配置，随后可用PropKit.get(...)获取值
		PropKit.use("dbconfig.txt");
		me.setDevMode(PropKit.getBoolean("devMode", false));
		me.setError500View("/common/500.html");
		me.setError403View("/common/403.html");
		me.setError404View("/common/404.html");
		me.setError401View("/common/401.html");
	}
	
	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		me.add("/", IndexController.class);	// 第三个参数为该Controller的视图存放路径，相同可以为省略
		me.add("/blog", BlogController.class,"views/blog");	// 第三个参数省略时默认与第一个参数值相同，在此即为 "/blog"
		me.add("/user", UserController.class,"views/user");	
		me.add("/role", RoleController.class,"views/role");	
		me.add("/resource", ResourceController.class,"views/resource");	
		me.add("/partner",PartnerController.class,"views/partner");
		me.add("/product",ProductController.class,"views/product");
		me.add("/sale",SaleController.class,"views/sale");
		me.add("/log", LogController.class,"views/log"); //操作日志
		//初始化
		me.add("/kmqcye",KmyeController.class,"views/kmye");//科目期初余额设置
		me.add("/accountCaption",AccountCaptionController.class,"views/accountCaption");
		//记账（凭证）
		me.add("/voucher",VoucherController.class,"views/voucher");
		me.add("/audit",AuditController.class,"views/voucher");
		//账簿
		me.add("/generalLedger",GeneralLedgerController.class,"views/generalLedger");//总账
		me.add("/subsidiaryLedger",SubsidiaryLedgerController.class,"views/subsidiaryLedger");//明细账
		me.add("/ssph",FseSsphController.class,"views/ssph");//发生额试算平衡表
		//报表
		me.add("/zcfzb",ZcfzbController.class,"views/zcfzb");//资产负债表
		me.add("/lrb",LrbController.class,"views/lrb");//利润表
		
		me.add("/msg", WeixinMsgController.class);
		me.add("/api", WeixinApiController.class);
		me.add("/test", TestController.class);
	}
	
	public static C3p0Plugin createC3p0Plugin() {
		return new C3p0Plugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
	}
	
	/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		// 配置C3p0数据库连接池插件
		C3p0Plugin C3p0Plugin = createC3p0Plugin();
		me.add(C3p0Plugin);
		
		// 配置ActiveRecord插件
		ActiveRecordPlugin arp = new ActiveRecordPlugin(C3p0Plugin);
		arp.setShowSql(true);
		me.add(arp);
		
		// 所有配置在 MappingKit 中搞定
		_MappingKit.mapping(arp);
		
		//定时任务配置文件加载
		me.add(new Cron4jPlugin(PropKit.use("task.properties")));
	}
	
	/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {
		me.addGlobalActionInterceptor(new LoginInterceptor()); //全局拦截器，进行权限和用户登录拦截
		me.addGlobalActionInterceptor(new LogInterceptor()); //全局拦截器，记录用户操作日志
		me.add(new SessionInViewInterceptor()); //拦截器来添加session到view中使用，首页读取登录用户名称
	}
	
	/**
	 * 配置处理器
	 */
	public void configHandler(Handlers me) {
		me.add(new ContextPathHandler("ctx"));   //ctx与WebRoot/common/_layout中的${ctx}对应。
		
	}
	
	/**
	 * 建议使用 JFinal 手册推荐的方式启动项目
	 * 运行此 main 方法可以启动项目，此main方法可以放置在任意的Class类定义中，不一定要放于此
	 */
	public static void main(String[] args) {
		JFinal.start("WebRoot", 8080, "/fms", 5);
	}
}
